package w.z.x.framework.repository.interfaces;

import java.io.Serializable;
import java.util.function.Consumer;

/**
 * 关联条件
 *
 * @author 魏祖潇
 */
public interface Join<T, Param, Child> extends Serializable {

    /**
     * 左关联
     *
     * @param clazz 关联对象
     * @param on    关联条件
     * @return Wrapper
     */
    default Child left(T clazz, Consumer<Param> on) {
        return left(clazz, "", on);
    }

    /**
     * 左关联
     *
     * @param clazz 关联对象
     * @param alias 关联对象别名
     * @param on    关联条件
     * @return Wrapper
     */
    Child left(T clazz, String alias, Consumer<Param> on);

    /**
     * 右关联
     *
     * @param clazz 关联对象
     * @param on    关联条件
     * @return Wrapper
     */
    default Child right(T clazz, Consumer<Param> on) {
        return right(clazz, "", on);
    }

    /**
     * 右关联
     *
     * @param clazz 关联对象
     * @param alias 别名
     * @param on    关联条件
     * @return Wrapper
     */
    Child right(T clazz, String alias, Consumer<Param> on);

    /**
     * 内关联
     *
     * @param clazz 关联对象
     * @param on    关联条件
     * @return Wrapper
     */
    default Child inner(T clazz, Consumer<Param> on) {
        return inner(clazz, "", on);
    }

    /**
     * 内关联
     *
     * @param clazz 关联对象
     * @param alias 别名
     * @param on    关联条件
     * @return Wrapper
     */
    Child inner(T clazz, String alias, Consumer<Param> on);

}
